<?php

/**
 * iamp核心基础类
 * @author Wj
 */
class Base
{
	// 保存 rcube_imap 对象实例
	protected $rcube_imap;
	// 邮箱imap服务器
	protected $server;
	// 邮箱账号
	protected $email;
	// 邮箱密码
	protected $pwd;
	// imap端口
	protected $port;
	// 加密规则
	protected $sercet;
	// 邮箱uid组成的数组
	protected $uids;
	// 验证是否通过的标识
	public $verifiyImap=true;
	// 邮件一页显示的数量
	
	/**
	 * 基础类构造
	 * @param array        $data    [连接 imap/smtp 服务器的参数]
	 * @param bool $isCheckImap [为true时强制连接服务器 ,进行验证imap服务器]
	 */
	public function __construct(array $data,bool $isCheckImap=false){
		if($isCheckImap){
			$this->connectImap($data); // 执行链接 用于绑定账号的时候 进行imap 服务器的验证
		}else{
			// 判断 imap 连接是否有效
			if(!is_callable([$this->rcube_imap,'check_connection']) || !$this->rcube_imap->check_connection()){
				$this->connectImap($data); // 执行链接
			}	
		}		
	}

	/**
	 * 异常抛出
	 */
	protected function outputException(string $errorInfo,int $errno){
		throw new Exception($errorInfo, $errno);	
	}

	/**
	 * 链接 imap 服务器
	 * @param array $data 存在5个键
	 * @return [type] [description]
	 */
	protected function connectImap(array $data){
		$this->server = $data['imapServer'] ?? '';
		$this->email = $data['emailAccount'] ?? '';
		$this->pwd = $data['pwd'] ?? '';
		$this->port = intval($data['imapPort'] ?? 0);
		$this->sercet = isset($data['imapSercet']) ? strtolower($data['imapSercet']) : null; // 'ssl' , 'tls', null 三个可选值 只能是小写
		$this->rcube_imap = rcube::get_instance(rcube::INIT_WITH_DB | rcube::INIT_WITH_PLUGINS)->get_storage();
		if(!$this->rcube_imap->connect($this->server,$this->email,$this->pwd,$this->port,$this->sercet)){
			//$this->verifiyImap = false; // 验证失败
			$this->outputException("Imap配置有误，验证失败",100); // 抛出异常
		}
	}

	/**
	 * 检测链接是否有效 无效的时候进行重连
	 */
	public function checkConnect(){
		if(!$this->rcube_imap->is_connected()){
			$this->outputException("链接已失效", 100);			
		}
	}

	/**
	 * 
	 */
	public function __destruct(){
		$this->rcube_imap->close();
	}
}